FireBird - zaujimave pretypovanie (zaokruhlenie)

Otázka od: Roland Turcan

16. 12. 2002 22:47

Hello Delphi CZ konferencia!

mam SP kde

pocet_dni je integer;
denny_urok je numeric(11,2);
rocny_urok je numeric(11,2);
istina je numeric(11,2);
urokovy_koeficient je double precision;

  if (ROCNY_UROK>0) then
  BEGIN
    UROKOVY_KOEFICIENT=ROCNY_UROK/365;
  END ELSE
  if (DENNY_UROK>0) then
    UROKOVY_KOEFICIENT=DENNY_UROK;

  UROK=ISTINA*POCET_DNI*UROKOVY_KOEFICIENT/100;

premenne maju hodnoty:

rocny_urok=17.6;
pocet_dni=684;
istina=230;

t.j.

urok=230*684*17.6/365/100;

ked si to hodite do "calc.exe" tak to je 75,858410958904109589041095890411

a SP mi vrati 62,928

dlho maturujem, ze co je trouble a zistil som ze v skripte sa vypocita
urokovy_koeficient ako 0.04 lebo 62.929=230*684*0.04/100;

proste ide ma j.bn.t!!!!

Preco ak som deklaroval urokovy_koeficient ako double precision tak mi
to oreze na dve desatinne?
Vycural som s nim tak, ze som opravil deklaraciu rocny_urok a denny_urok
na double precision a uz to funguje, ale nech mi pliz niekto vysvetli
tento paranormalny jav!

--
Best regards, TRoland
http://www.rotursoft.sk

Odpovedá: Skopalik Slavomir

16. 12. 2002 23:27

Jedna z mnoha klasickych chyb FB se zaokroulovanim a pretypovanim.
Vetsina techto problemu by mela byt odstranena v FB1.5.
Pokud toto nastava i ve FB 1.5, tak to zaloguj prosim na SourceForge.

 Slavek

> Hello Delphi CZ konferencia!
>
> mam SP kde
>
> pocet_dni je integer;
> denny_urok je numeric(11,2);
> rocny_urok je numeric(11,2);
> istina je numeric(11,2);
> urokovy_koeficient je double precision;
>
> if (ROCNY_UROK>0) then
> BEGIN
> UROKOVY_KOEFICIENT=ROCNY_UROK/365;
> END ELSE
> if (DENNY_UROK>0) then
> UROKOVY_KOEFICIENT=DENNY_UROK;
>
> UROK=ISTINA*POCET_DNI*UROKOVY_KOEFICIENT/100;
>
> premenne maju hodnoty:
>
> rocny_urok=17.6;
> pocet_dni=684;
> istina=230;
>
> t.j.
>
> urok=230*684*17.6/365/100;
>
> ked si to hodite do "calc.exe" tak to je 75,858410958904109589041095890411
>
> a SP mi vrati 62,928
>
> dlho maturujem, ze co je trouble a zistil som ze v skripte sa vypocita
> urokovy_koeficient ako 0.04 lebo 62.929=230*684*0.04/100;
>
> proste ide ma j.bn.t!!!!
>
> Preco ak som deklaroval urokovy_koeficient ako double precision tak mi
> to oreze na dve desatinne?
> Vycural som s nim tak, ze som opravil deklaraciu rocny_urok a denny_urok
> na double precision a uz to funguje, ale nech mi pliz niekto vysvetli
> tento paranormalny jav!
>
> --
> Best regards, TRoland
> http://www.rotursoft.sk
>

Odpovedá: Petr Palicka aka PeC@

16. 12. 2002 23:18

Ahoj Roland,

> dlho maturujem, ze co je trouble a zistil som ze v skripte sa vypocita
> urokovy_koeficient ako 0.04 lebo 62.929=230*684*0.04/100;

no ba ze  
nedavno tu psal Pavel Cisar, ze vysledny pocet mist vysledku je dany
prostym souctem desetinnych mist vsech operandu (nebo mozna trochu
kecam), takze:

pokud UROKOVY_KOEFICIENT=ROCNY_UROK/365;
a
rocny_urok je numeric(11,2) a ma 2 des. mista a 365 ma 0 des.mist
tudiz 17.6/365 = 0.04

reseni by melo byt:

UROKOVY_KOEFICIENT=ROCNY_UROK/cast(365 as double precision);
nebo mozna
UROKOVY_KOEFICIENT=ROCNY_UROK/365.00000000000000;

peca

Odpovedá: Roland Turcan

17. 12. 2002 12:04

>> dlho maturujem, ze co je trouble a zistil som ze v skripte sa vypocita
>> urokovy_koeficient ako 0.04 lebo 62.929=230*684*0.04/100;

<<< 17. 12. 2002 9:12 - Petr Palicka aka PeC@ "palicka.petr@seznam.cz" >>>
PPaP> no ba ze  
PPaP> nedavno tu psal Pavel Cisar, ze vysledny pocet mist vysledku je dany
PPaP> prostym souctem desetinnych mist vsech operandu (nebo mozna trochu
PPaP> kecam), takze:

PPaP> UROKOVY_KOEFICIENT=ROCNY_UROK/cast(365 as double precision);

toto je to prave orechove.

Dakujem.


--
Best regards, TRoland
http://www.rotursoft.sk